package ${packagePrefix}.${domainObjectName?lower_case}.infrastructure.excel;

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;

<#if generateComments>
/**
 * ${domainObjectName}Excel读取监听器
 * <p>
 * 用于处理Excel导入时的数据读取和批量处理
 * </p>
 *
 * @param <T> 数据类型
 * @author Auto Generated
 */
</#if>
@Slf4j
public class ${domainObjectName}ExcelReadListener<T> extends AnalysisEventListener<T> {

    /**
     * 批处理大小
     */
    private static final int BATCH_SIZE = 100;

    /**
     * 数据列表，用于批量处理
     */
    private final List<T> dataList = new ArrayList<>(BATCH_SIZE);

    /**
     * 数据处理函数
     */
    private final Consumer<List<T>> dataConsumer;

    /**
     * 总记录数
     */
    private int totalCount = 0;

    <#if generateComments>
    /**
     * 构造函数
     *
     * @param dataConsumer 数据处理函数
     */
    </#if>
    public ${domainObjectName}ExcelReadListener(Consumer<List<T>> dataConsumer) {
        this.dataConsumer = dataConsumer;
    }

    @Override
    public void invoke(T data, AnalysisContext context) {
        dataList.add(data);
        totalCount++;
        
        // 达到BATCH_SIZE后，进行批量处理
        if (dataList.size() >= BATCH_SIZE) {
            processData();
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 处理剩余数据
        if (!dataList.isEmpty()) {
            processData();
        }
        log.info("Excel导入完成，共处理 {} 条数据", totalCount);
    }

    <#if generateComments>
    /**
     * 批量处理数据并清空缓存
     */
    </#if>
    private void processData() {
        log.debug("处理Excel数据批次，数量: {}", dataList.size());
        try {
            // 调用处理函数
            dataConsumer.accept(new ArrayList<>(dataList));
        } catch (Exception e) {
            log.error("处理Excel数据异常", e);
            throw new RuntimeException("处理Excel数据失败: " + e.getMessage());
        } finally {
            // 清空已处理的数据
            dataList.clear();
        }
    }

    <#if generateComments>
    /**
     * 获取总记录数
     *
     * @return 总记录数
     */
    </#if>
    public int getTotalCount() {
        return totalCount;
    }
} 